package org.example.springbook.service;


import lombok.extern.slf4j.Slf4j;
import org.example.springbook.dao.BookDao;
import org.example.springbook.enums.BookStatusEnum;
import org.example.springbook.mapper.BookInfoMapper;
import org.example.springbook.model.BookInfo;
import org.example.springbook.model.PageRequest;
import org.example.springbook.model.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class BookService {
    @Autowired
    private BookInfoMapper bookInfoMapper;

    //dao层的代码已经可以删掉了
    //因为我们之前用的是mock的数据

    /*@Autowired
    private BookDao bookDao;


    //service层要从dao层拿数据
    public List<BookInfo> getBookList() {
     List<BookInfo> bookInfos = bookDao.mockData();
     for (BookInfo bookInfo : bookInfos) {
        if (bookInfo.getStatus()==1){
            bookInfo.setStatusCN("可借阅");
        }else {
            bookInfo.setStatusCN("不可借阅");
        }
    }
     return bookInfos;
    }*/

    //Service 是 Controller 和 数据库mapper之间的桥梁
    //BookController 拿到了前端传递的参数
    // 那么现在要将前端传递过来的参数转化为 我们数据库中的offset和limit(也就是pageSize)
    // 这个操作在Controller层做也可以 在 Service层做也可以 我们就选择在Service层做
    public PageResult<BookInfo> selectBookInfoByPage(PageRequest pageRequest){
        //获取总记录数 从数据库中获取
        Integer count = bookInfoMapper.count();
        //获取当前页面内容
        // 获取开始索引
        // 但是下面这样写会显得不优雅 因为他是通过pageRequest的属性算出的
        // 那么我们悄悄地可以将offset放到PageRequest的属性中
        // Integer offset = (pageRequest.getCurrentPage() - 1) * pageRequest.getPageSize();


        List<BookInfo> bookInfos = bookInfoMapper.selectBookInfoByPage(pageRequest.getOffset(), pageRequest.getPageSize());

        // 上面拿到了总记录数和当前页的内容
        // 那么通过new 一个PageResult对象将数据设置到对象里
        /*// 但是这块代码显得也是有点难看
        // 那我们可以将这块代码封装一下 放到PageResult中
        PageResult<BookInfo> pageResult = new PageResult<>();
        pageResult.setTotal(count);
        pageResult.setRecords(bookInfos);
        return pageResult;*/

        //拿到了上面两个参数后 也可以进行以下校验
        // 然后需要对图书数据进行处理
        // 我的项目中是没有写图书详情的 只有一个图书状态
        // 那么如果我添加了图书详情这一选项 那么下面的代码也要添加到里面 或着 有改动
        // 这是一种硬编码的方式 不是很建议 那我们就可以枚举去映射来解决这个问题
        if (bookInfos != null && !bookInfos.isEmpty()){
            // 这里的代码 做的事情就是根据status 获取状态
            // 那么怎么获取呢 可以在枚举类中写一个方法
            for (BookInfo bookInfo : bookInfos){
                bookInfo.setStatusCN(BookStatusEnum.getNameByCode(bookInfo.getStatus()).getName());

                /*if (bookInfo.getStatus() == 1) {
                    bookInfo.setStatusCN("可借阅");
                }else {
                    bookInfo.setStatusCN("不可借阅");
                }*/
            }
        }

        // 这里将pageRequest加入进去 是因为前端在实现翻页功能的时候
        // 当前是第几页要从url中获取 比较麻烦
        //那么在我的项目中那就直接由后端返回
        // 而当前是第几页的信息在pageRequest中存着 所以将pageRequest放在了下面参数的位置
        // 所以PageResult的构造函数也要新加入pageRequest
        return new PageResult<>(bookInfos, count, pageRequest);
    }

    public Integer addBook(BookInfo bookInfo){
        Integer result = 0;
        try{
            result = bookInfoMapper.insertBook(bookInfo);
        }catch (Exception e){
            log.info("添加图书失败, e:{}", e.getMessage());
        }
        return result;
    }

    public BookInfo queryBookInfoById(Integer id){
        return bookInfoMapper.queryBookInfoById(id);
    }

    public Integer updateBook(BookInfo bookInfo){
        Integer result = 0;
        try{
            result = bookInfoMapper.updateBook(bookInfo);

        }catch (Exception e){
            log.error("更新图书失败, e:{}", e.getMessage());
        }
        return result;
    }

    public Integer batchDelete(List<Integer> ids){
        Integer result =0;
        try {
            result = bookInfoMapper.batchDelete(ids);
        }catch (Exception e){
            log.error("批量删除图书失败, ids:{}",ids);
        }
        return result;
    }
}
